// pages/formLogin/index.js
const app = getApp();
const db = app.db;

Page({
  data: {
    phone: '',        // 手机号
    code: '',         // 验证码
    loginDisabled: true, // 登录按钮是否禁用
    codeBtnStatus: 'disabled', // 状态：disabled/active/countdown
    codeBtnText: '获取验证码', // 验证码按钮文案
    countdown: 0,     // 倒计时（秒）
    countdownTimer: null // 计时器实例（初始化）
  },

  // 监听手机号输入
  onPhoneInput(e) {
    const phone = e.detail.value.trim();
    this.setData({ phone }, () => {
      this.validatePhone();
      this.checkForm();
    });
  },

  // 校验手机号格式并更新按钮状态
  validatePhone() {
    const { phone, countdown } = this.data;
    if (countdown > 0) return; // 倒计时期间不更新状态

    const isValid = /^1\d{10}$/.test(phone);
    this.setData({
      codeBtnStatus: isValid ? 'active' : 'disabled',
      // 优化文本提示：格式错误时明确提示
      codeBtnText: isValid ? '获取验证码' : '请输入正确手机号'
    });
  },

  // 获取验证码
  async handleGetCode() {
    const { phone, codeBtnStatus } = this.data;
    if (codeBtnStatus !== 'active') return;

    try {
      // 生成6位随机验证码
      const code = Math.floor(100000 + Math.random() * 900000).toString();
      const expireTime = Date.now() + 5 * 60 * 1000; // 5分钟有效期
      
      // 1. 删除该手机号之前的验证码
      await db.collection('verify_codes').where({ phone }).remove();
      
      // 2. 存储新验证码到数据库
      await db.collection('verify_codes').add({
        data: { phone, code, expire_time: expireTime, used: false, create_time: Date.now() }
      });

      // 3. 提示并初始化倒计时状态
      wx.showToast({ title: '验证码已发送', icon: 'success' });
      this.setData({
        codeBtnStatus: 'countdown',
        countdown: 60, 
        codeBtnText: '60秒后重试'
      });

      // 4. 启动倒计时
      this.data.countdownTimer = setInterval(() => {
        const currentCountdown = this.data.countdown - 1;
        this.setData({
          countdown: currentCountdown,
          codeBtnText: `${currentCountdown}秒后重试`
        });

        if (currentCountdown <= 0) {
          clearInterval(this.data.countdownTimer);
          this.validatePhone(); // 恢复按钮状态
        }
      }, 1000);

    } catch (err) {
      console.error('发送验证码失败:', err);
      wx.showToast({ title: '发送失败，请重试', icon: 'none' });
    }
  },

  // 监听验证码输入
  onCodeInput(e) {
    const code = e.detail.value.trim(); 
    this.setData({ code }, () => {
      this.checkForm();
    });
  },

  //登录的前置工作
  // 检查表单是否可提交
  checkForm() {
    const { phone, code } = this.data;
    // 同时校验：手机号格式正确 + 验证码非空
    const canLogin = /^1\d{10}$/.test(phone) && code.trim();
    this.setData({ loginDisabled: !canLogin });
  },
  // 验证验证码并登录
  async handleVerifyCode() {
    const { phone, code } = this.data;
    // 前置校验：避免无效请求
    if (!/^1\d{10}$/.test(phone)) {
      wx.showToast({ title: '请输入正确手机号', icon: 'none' });
      return;
    }
    if (!code || code.length !== 6) {
      wx.showToast({ title: '请输入6位验证码', icon: 'none' });
      return;
    }

    try {
      // 查询有效验证码
      const res = await db.collection('verify_codes')
        .where({
          phone,
          code,
          used: false,
          expire_time: db.command.gt(Date.now()) // 未过期
        })
        .orderBy('create_time', 'desc')
        .limit(1)
        .get();

      if (res.data.length === 0) {
        wx.showToast({ title: '验证码无效或已过期', icon: 'none' });
        return;
      }

      // 标记为已使用
      await db.collection('verify_codes')
        .doc(res.data[0]._id)
        .update({ data: { used: true } });
        console.log('开始处理用户数据，手机号：', phone); // 确认phone有效
      //传入本地user数据库
      const userData = {
        phone, 
        login_time: db.serverDate(),
        last_login_time: db.serverDate(),
        is_verified: true,
      };

      //查询用户是否已存在（通过手机号匹配）
      const userRes = await db.collection('user')
        .where({ phone }) // 用手机号作为唯一标识
        .limit(1)
        .get();
        console.log('查询用户结果：', userRes.data); // 确认是否查询到用户

      if (userRes.data.length > 0) {
        //若用户已存在：仅更新最后登录时间
        await db.collection('user')
          .doc(userRes.data[0]._id) // 用户记录的唯一ID
          .update({
            data: { last_login_time: db.serverDate() } // 只更新最后登录时间
          });
      } else {
        //若用户不存在：创建新用户记录
        const addRes = await db.collection('user').add({ data: userData });
        console.log('新用户创建成功');
        console.log('新增用户结果：', addRes); // 打印新增结果（有_id则成功）
      }  

      // 保存登录状态(本地存储)
      this.setData({ isLogin: true });
      wx.setStorageSync('loginPhone', phone);
      wx.setStorageSync('isLogin', true);

      // 登录成功跳转
      wx.showToast({ title: '登录成功', icon: 'success' });
      setTimeout(() => {
        wx.switchTab({ url: '/pages/home/index' });
      }, 1000);

    } catch (err) {
      console.error('验证失败:', err);
      wx.showToast({ title: '验证失败，请重试', icon: 'none' });
    }
  },
  
  //扫尾工作
  // 页面隐藏/卸载时清除计时器
  onHide() {
    this.clearTimer();
  },
  onUnload() {
    this.clearTimer();
  },
  // 封装清除计时器方法
  clearTimer() {
    if (this.data.countdownTimer) {
      clearInterval(this.data.countdownTimer);
      this.data.countdownTimer = null;
    }
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})